package cn.itsource.properties;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Properties;

/**
 *	Properties:
 *		1. 概念：就是一个特殊的HashTable，key和value都是String类型，常用来做配置文件
 *		2. 作用：
 *				解决了Java编程中的硬编码问题。
 *		3. 使用：
 *			3.1. 将内存中的数据，写出到硬盘
 *				void list(PrintStream out) 将此属性列表打印到指定的输出流。  
				void list(PrintWriter out) 将此属性列表打印到指定的输出流。  
 *
 *			2. 将硬盘中的数据，读取到内存
 *				void load(InputStream inStream) 从输入字节流读取属性列表（键和元素对）。  
				void load(Reader reader) 以简单的线性格式从输入字符流读取属性列表（关键字和元素对）。 
 *
 *		4. 注意事项：
 *			
 */
public class PropertiesTest2 {

	public static void main(String[] args) {
		/*
		 * 构造方法：
		 * 	Properties() 创建一个没有默认值的空属性列表。  
			Properties(Properties defaults) 创建具有指定默认值的空属性列表。  
		 */
		Properties p = new Properties();
		
		/*
		 * 2. 将硬盘中的数据，读取到内存
 *				void load(InputStream inStream) 从输入字节流读取属性列表（键和元素对）。  
 				
 *					这里需要InputStream对象，但是InputStream是抽象类，所以需要从API中找到InputStream子类FileInputStream 构造方法
 *					FileInputStream(String name) 
 *						name：文件名
 *							1. 绝对路径：是从盘符（Windows）或者根目录（Linux）开始的
 *							2. 相对路径：是从当前项目开始，保存到当前项目下
				
				void load(Reader reader) 以简单的线性格式从输入字符流读取属性列表（关键字和元素对）。 
				
				 IO流必须要关闭，释放资源
		 */
		FileInputStream fis = null;//因为下面关流，所以必须保证ps能够在finally中访问到，所以要声明在try上面
		try {
			//创建一个FileInputStream对象
			fis = new FileInputStream("mysql.properties");//相对路径直接用文件名即可
			
			//将 PrintStream对象传入load方法
			p.load(fis);
			
			//调用Properties对象的方法，获取配置文件信息
			//String getProperty(String key) 使用此属性列表中指定的键搜索属性。  
			String uname = p.getProperty("uname");
			String pwd = p.getProperty("pwd");
			System.out.println("用户名：" + uname + "   密码：" + pwd);
			
			//String getProperty(String key, String defaultValue) 如果有key，则正常获取对应的value值，如果Properties中没有该key，则返回defaultValue
			String username = p.getProperty("username", "没有该用户名");
			System.out.println(username);
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//必须关流ps,调用ps.close()，记得关流前，做非空判断
			if (fis != null) {
				try {
					fis.close();//有异常继续try
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

}
